# Supabase

Langchain支持使用Supabase Postgres数据库作为向量存储使用'pgvector' postgres扩展。 有关更多信息，请参阅[Supabase博客文章](https://supabase.com/blog/openai-embeddings-postgres-vector)。

## 设置

### 安装库

```bash npm2yarn
npm install -S @supabase/supabase-js

```


### 在您的数据库中创建表和搜索功能

在您的数据库中运行此命令:

```sql
-- Enable the pgvector extension to work with embedding vectors

create extension vector;



-- Create a table to store your documents

create table documents (

  id bigserial primary key,

  content text, -- corresponds to Document.pageContent

  metadata jsonb, -- corresponds to Document.metadata

  embedding vector(1536) -- 1536 works for OpenAI embeddings, change if needed

);



-- Create a function to search for documents

create function match_documents (

  query_embedding vector(1536),

  match_count int DEFAULT null,

  filter jsonb DEFAULT '{}'

) returns table (

  id bigint,

  content text,

  metadata jsonb,

  similarity float

)

language plpgsql

as $$

#variable_conflict use_column

begin

  return query

  select

    id,

    content,

    metadata,

    1 - (documents.embedding <=> query_embedding) as similarity

  from documents

  where metadata @> filter

  order by documents.embedding <=> query_embedding

  limit match_count;

end;

$$;

```


## 使用

import CodeBlock from "@theme/CodeBlock";

import Example from "!!raw-loader!@examples/indexes/vector_stores/supabase.ts";

import MetadataFilterExample from "!!raw-loader!@examples/indexes/vector_stores/supabase_with_metadata_filter.ts";

import MetadataQueryBuilderFilterExample from "!!raw-loader!@examples/indexes/vector_stores/supabase_with_query_builder_metadata_filter.ts";


### 标准用法

下面的示例显示如何使用Supabase执行基本相似性搜索:

<CodeBlock language="typescript">{Example}</CodeBlock>


### 元数据过滤

对于上述的'match_documents' Postgres函数，您还可以传递一个过滤参数，以仅使用特定元数据字段值的文档。该过滤器参数是一个JSON对象，'match_documents'函数将使用Postgres JSONB包含操作符'@>'根据您指定的元数据字段值过滤文档。有关更多信息，请参见[Postgres JSONB包含操作符](https://www.postgresql.org/docs/current/datatype-json.html#JSON-CONTAINMENT)。

**注意:** 如果您之前使用过`SupabaseVectorStore'，您可能需要根据上述更新的SQL放弃和重新创建'match_documents'函数以使用此功能。

<CodeBlock language="typescript">{MetadataFilterExample}</CodeBlock>


### 元数据查询构建器过滤


You can also use query builder-style filtering similar to how [the Supabase JavaScript library works](https://supabase.com/docs/reference/javascript/using-filters) instead of passing an object. Note that since most of the filter properties are in the metadata column, you need to use arrow operators (`->` for integer or `->>` for text) as defined in [Postgrest API documentation](https://postgrest.org/en/stable/references/api/tables_views.html?highlight=operators#json-columns) and specify the data type of the property (e.g. the column should look something like `metadata->some_int_value::int`).



<CodeBlock language="typescript">{MetadataQueryBuilderFilterExample}</CodeBlock>

